;^Z80^
TITLE FILE: TAPE_INTE:TOS HEWLETT-PACKARD: TAPE_INTERFACE (c) Coleco 1983 Confidential
;NAME ^Rev 02 - GPB^
De_TAPE_INTERFACE MACRO ;Header Rev. 5
.GOTO Ede_TAPE_INTERFACE
Project: TAPE, C101
******************************
* *
* TAPE_INTERFACE DTT *
* *
******************************
Rev History
Rev. Date Name Change
2 11/2/83 GPB CHANGED RANGE TO RANGE_ ( duplicate symbol problem)
1 9/13/83 DTT CHANGED TO ALLOW ERROR RETIRES
0 7/5/83 DTT Initial Pseudo Code
Function:
REQUEST READS AND WRITES AS DEFINED IN OCB.
REQUESTS ABORT_TAPE.
TEST STATUS OF TAPE REQUEST.
Ede_TAPE_INTERFACE MEND
Pseudo_code_TAPE_INTERFACE MACRO ;Pseudocode macro area
BEGIN:
STORE OVERLAY_NUMBER
HL := POINTER TO OCB := OVERLAY_NUMBER*5 + OVERLAY_TABLE_POINTER
MOVE OCB TO CSA
IF WRITE THEN
SEND WRITE_COMMAND
ELSE
SEND READ_COMMAND
ENDIF
END
.GOTO Ep_TAPE_INTERFACE
Ep_TAPE_INTERFACE MEND
;Subroutines called
; EXT
;Subroutines defined
GLOBAL TEST_TAPE
GLOBAL ABORT_TAPE
GLOBAL LOAD_OVERLAY
GLOBAL WRITE_OVERLAY
GLOBAL CALC_OCB_ADDR
GLOBAL WRITE_BLOCKS
GLOBAL LOAD_BLOCKS
GLOBAL BLOCK_IO
; GLOBAL
;Operating system calls
; EXT
;Inputs/Outputs passed in registers
; A = OVERLAY NUMBER 1 thru N
; A <> 0 = ERROR
;External data areas used
EXT OCB_PTR ;POINTER TO OVERLAY CONTROL TABLE
;Global data areas defined
GLOBAL OVERLAY_NUMBER
GLOBAL TAPE_STATE
GLOBAL CSA
GLOBAL XFER_ADDR
GLOBAL BLOCK_NUM
GLOBAL RANGE_
; GLOBAL
;Local equates
; EQU
;Global equates
GLOBAL READ_TAPE
GLOBAL WRITE_TAPE
GLOBAL KILL_TAPE
READ_TAPE EQU 81H
WRITE_TAPE EQU 82H
KILL_TAPE EQU 87H
; INCLUDE File_name:userid
PROG
; TEST FOR COMPLETION OF IO REQUEST
TEST_TAPE:
LD A,(CSA)
OR A
JP EXIT_TAPE
;*
;*
;*
ABORT_TAPE:
LD A,KILL_TAPE
LD (CSA),A
JP EXIT_TAPE
;*
;*
CALC_OCB_ADDR:
DEC A ;ADDR = OCB_TABLE(OV_NUM-1*5)
LD C,A ;GET THE OVERLAY NUMBER IN C
LD B,0
LD HL,(OCB_PTR) ;POINTER TO THE OCB TABLE
ADD HL,BC ;OCB_ADDR = OVERLAY_NUM*5 + START_OF_TABLE
ADD HL,BC
ADD HL,BC
ADD HL,BC
ADD HL,BC
RET
;*
WRITE_OVERLAY:
SCF ;SET CARRY FLAG IF WRITE INSTRUCTION!
JR LD_1
;*
;*
LOAD_OVERLAY:
OR A ;RESET CARRY FLAG IF READ
;*
;*
LD_1:
; BEGIN (Ordinarily registers are restored; retain only the pushes and pops you need.)
;*
;*
;*
LD (OVERLAY_NUMBER),A ;FOR DEBUGGING PURPOSES
;*
;*
PUSH AF ;++++++++++++++++++++;
CALL CALC_OCB_ADDR ;
POP AF ;--------------------; ;SAVE THE CARRY FLAG IF SET
;*
JR NC,LOAD_BLOCKS
WRITE_BLOCKS:
LD A,WRITE_TAPE ;WRITE INSTRUCTIONS GO HERE
JR BLOCK_IO
LOAD_BLOCKS:
LD A,READ_TAPE ;READ INSTRUCTIONS GO HERE
BLOCK_IO:
LD DE,CSA+1 ; ;POINT TO THE COMMAND STATUS AREA
LD BC,5 ; ;NUMBER OF BYTES TO MOVE
LDIR
LD DE,CSA
LD (DE),A ;SET THE COMMAND IN THE CSA BUFFER
XOR A
GLOBAL EXIT_TAPE
EXIT_TAPE:
RET
;*********************************************************************************************
DATA
OVERLAY_NUMBER DEFS 1
TAPE_STATE DEFS 1
CSA DEFS 6
XFER_ADDR EQU CSA+1
BLOCK_NUM EQU XFER_ADDR+2
RANGE_ EQU BLOCK_NUM+2